home *** CD-ROM | disk | FTP | other *** search
/ BBS Toolkit / BBS Toolkit.iso / doors_2 / twview93.zip / MISC.INC < prev    next >
Text File  |  1992-06-07  |  8KB  |  340 lines

  1. function str( n : integer; width : integer ) : string;
  2. { convert integer to string }
  3. var
  4.   negative : boolean;
  5.   s : string;
  6. begin
  7.   if n = 0 then
  8.     s := '0'
  9.   else
  10.     begin
  11.       negative := false;
  12.       s := '';
  13.       if n < 0 then
  14.         begin
  15.           negative := true;
  16.           n := -n;
  17.         end;
  18.       while n > 0 do
  19.         begin
  20.           s := chr( n mod 10 + ord('0') ) + s;
  21.           n := n div 10;
  22.         end; {while}
  23.       if negative then
  24.         s := '-'+s;
  25.     end; {else}
  26.   while length(s) < width do
  27.     if odd( length(s) ) then
  28.       s := s + ' '
  29.     else
  30.       s := ' ' + s;
  31.   str := s;
  32. end; {str}
  33.  
  34. function die( size : integer ) : integer;
  35. begin
  36.   die := random( size )  + 1;
  37. end;
  38.  
  39. function prompt( p : string ) : boolean;
  40. { returns true if they say yes }
  41. var
  42.   ch : string;
  43. begin
  44.   write(p);
  45.   readln( ch );
  46.   prompt := ch[1] in ['Y','y'];
  47. end; {again}
  48.  
  49. function BackupString( s : string ) : string;
  50. { given a filename, create an appropriate backup }
  51. var
  52.   i : integer;
  53.   ext : string;
  54. begin
  55.   i := pos( '.', s);
  56.   if i = 0 then
  57.     BackupString := s + '.bak'
  58.   else
  59.     begin
  60.       ext := copy( s, i + 1, 3 );
  61.       ext[1] := upcase( ext[1] );
  62.       ext[2] := upcase( ext[2] );
  63.       ext[3] := upcase( ext[3] );
  64.       if ext = 'BAK' then
  65.         BackupString := copy( s, 1, i ) + 'bar'
  66.       else
  67.         BackupString := copy( s, 1, i ) + 'bak';
  68.     end; {else}
  69. end;
  70.  
  71. procedure MakeBackup( fname : string );
  72. { copy current to backup, erasing backup if needed. }
  73. var
  74.   f : text;
  75.   bname : string;
  76. begin
  77.   bname := backupstring( fname );
  78.   assign( f, bname );
  79. {$I-}
  80.   reset( f );
  81. {$I+}
  82.   if IOResult = 0 then
  83.     begin
  84.       close( f );
  85.       erase( f );
  86.     end;
  87.   assign( f, fname );
  88.   rename( f, bname );
  89. end; {MakeBackup}
  90.  
  91. function GetNewFileName( promptstring : string; default : string ) : string;
  92. { Get a valid filename.  Warn if clobbering existing file. }
  93. var
  94.   filename : string;
  95.   g        : text;
  96.   errorcode: integer;
  97.  begin
  98.   repeat
  99.     write( promptstring, '[', default, ']  ' );
  100.     readln( filename );
  101.     if filename = '' then
  102.       if default = abort then
  103.         halt
  104.       else
  105.         filename := default;
  106.     if filename = abort then
  107.       halt;
  108.     assign( g, filename );
  109.     {$I-}
  110.     reset( g );
  111.     {$I+}
  112.     errorCode := ioResult;
  113.     if errorCode = 0 then 
  114.       begin
  115.         close( g );
  116.         write('File already exists! ');
  117.         if prompt('Backup? ') then
  118.           begin
  119.             MakeBackup( filename );
  120.             errorcode := FileNotFound;
  121.           end
  122.         else if prompt('Overwrite? ') then
  123.           errorcode := FileNotFound;
  124.       end; {if}
  125.   until errorcode = FileNotFound;
  126.   GetNewFilename := filename;
  127. end; {GetNewFilename}
  128.  
  129. function GetOldFileName( promptstring : string; default : string ) : string;
  130. var
  131.   filename : string;
  132.   f        : text;
  133.   errorcode: integer;
  134. begin
  135.   repeat
  136.     write( promptstring, '[', default, ']  ' );
  137.     readln( filename );
  138.     if filename = '' then
  139.       if default = abort then
  140.         halt
  141.       else
  142.         filename := default;
  143.     if filename = abort then
  144.       halt;
  145.     assign( f, filename );
  146.     {$I-}
  147.     reset( f );
  148.     {$I+}
  149.     errorCode := ioResult;
  150.     if errorcode = 0 then
  151.       close( f )
  152.     else
  153.       writeln('Error ', errorCode, ' opening file!');
  154.   until errorCode = 0;
  155.   GetOldFileName := filename;
  156. end; {GetOldFileName}
  157.  
  158. function min( a, b : integer ) : integer;
  159. begin
  160.   if a > b then
  161.     min := b
  162.   else
  163.     min := a;
  164. end;
  165.  
  166. function minreal( a, b : real ) : real;
  167. begin
  168.   if a > b then
  169.     minreal := b
  170.   else
  171.     minreal := a;
  172. end; {minreal}
  173.  
  174. function IsWarp( from, OverTo : sector ) : boolean;
  175. { true if you can go from from to OverTo in one step }
  176. var
  177.   t : warpIndex;
  178. begin
  179.   IsWarp := false;
  180.   if space.sectors[ from ].number <> UnExplored then
  181.     for t := 1 to space.sectors[ from ].number do
  182.       if space.sectors[ from ].data[t] = OverTo then
  183.         IsWarp := true;
  184. end; {IsWarp}
  185.  
  186. function GetSector : SectorIndex;
  187. var
  188.   s : integer;
  189. begin
  190.   repeat
  191.     write('Sector? [0 to abort]  ');
  192.     readln( s );
  193.   until (s>=0) and (s<=MaxSector);
  194.   GetSector := s;
  195. end; {GetSector}
  196.  
  197. function LogToDisk( var f : text; message : string; default : string ) : boolean;
  198. var
  199.   filename : string;
  200.   ch       : char;
  201. begin
  202.   if not prompt( message ) then
  203.     LogToDisk := false
  204.   else
  205.     begin
  206.       LogToDisk := true;
  207.       assign( f, GetNewFilename( 'Log file? ', default) );
  208.       rewrite( f );
  209.     end; {else}
  210. end; {LogToDisk}
  211.  
  212. function upcase( ch : char ) : char;
  213. { if letter in 'a'..'z' give upper case equivalent }
  214. begin
  215.   if ch in ['a'..'z'] then
  216.     upcase := chr( ord( ch ) - ord('a') + ord('A') )
  217.   else
  218.     upcase := ch;
  219. end; {upcase}
  220.  
  221. function appearanceCount ( base : sector ) : integer;
  222. { returns number of sectors that warp into base sector }
  223. var
  224.   s : sector;
  225.   count : integer;
  226.   i : warpIndex;
  227. begin
  228.   count := 0;
  229.   for s := 1 to maxSector do
  230.     with space.sectors[s] do
  231.       for i := 1 to number do
  232.         if data[i] = base then
  233.           count := count + 1;
  234.   appearanceCount := count;
  235. end;
  236.  
  237. function HowFar( base : sector ) : integer;
  238. { return length of path leaving base sector }
  239. var
  240.   previous, current, NextUp : sector;
  241.   len : integer;
  242. begin
  243.   previous := base;
  244.   current := space.sectors[base].data[1];
  245.   len := 1;
  246.   while (space.sectors[current].number = 2) do
  247.     begin
  248.       NextUp := space.sectors[current].data[1];
  249.       if NextUp = previous then
  250.         NextUp := space.sectors[current].data[2];
  251.       previous := current;
  252.       current := nextUp;
  253.       len := len + 1;
  254.     end; {while}
  255.   HowFar := len;
  256. end;
  257.  
  258. procedure skip( var f : text; n : integer);
  259. var
  260.   ch : char;
  261. begin
  262.   for n := 1 to n do
  263.     read( f, ch );
  264. end; {skip}
  265.  
  266. function ReadNumber( var f : text) : integer;
  267. { Read the next number from text file f.  If there is no next number,
  268. return 0.}
  269. var
  270.   number : integer;
  271.   ch : char;
  272.   i  : integer;
  273. begin
  274.   number := 0;
  275.   if not eof( f ) then
  276.     begin
  277.       read( f, ch );
  278.       while (ch <= ' ') and (not eof(f)) do begin read( f, ch ); end;
  279.       repeat
  280.         if ch in ['0'..'9'] then
  281.           number := number * 10 + ord( ch ) - ord( '0' );
  282.         if not eof( f ) then
  283.           begin read( f, ch ); end
  284.         else
  285.           ch := #26;
  286.       until (not (ch in ['0'..'9']));
  287.       if ch = '[' then     {hit [PAUSE]^h^h^h^h^h^h^h}
  288.         skip( f, 32 );
  289.     end;
  290.   ReadNumber := number;
  291. end;
  292.  
  293. function PortNumber( s : sector ) : PortIndex;
  294. { return the entry into the list of ports corresponding to port s;
  295.   return 0 if port not found. }
  296. var
  297.   i : portptr;
  298. begin
  299.   PortNumber := 0;
  300.   if space.Ports.top > 0 then
  301.     for i := 1 to space.Ports.top do
  302.       if space.Ports.data[ i ].where = s then
  303.         PortNumber := i;
  304. end; {PortNumber}
  305.  
  306. function NoteNumber( s : sectorIndex ) : integer;
  307. { return the entry into the list of notes corresponding to sector s;
  308.   return 0 if note not found. }
  309. var
  310.   i : 0..MaxNote;
  311. begin
  312.   NoteNumber := 0;
  313.   if space.Ports.top > 0 then
  314.     for i := 1 to space.Notes.top do
  315.       if space.notes.data[ i ].reference = s then
  316.         NoteNumber := i;
  317. end; {PortNumber}
  318.  
  319. function GetPortType : stuff;
  320. var
  321.   pt : integer;
  322. begin
  323.   repeat
  324.     writeln('Describe this port:');
  325.     writeln(' 0 : BBB Buy all products');
  326.     writeln(' 1 : SBB Sell Fuel Ore; buy Organics and Equipment');
  327.     writeln(' 2 : BSB Sell Organics; buy Fuel Ore and Equipment');
  328.     writeln(' 3 : SSB Sell Fuel Ore and Organics; buy Equipment');
  329.     writeln(' 4 : BBS Sell Equipment; buy Fuel Ore and Organics');
  330.     writeln(' 5 : SBS Sell Equipment and Fuel Ore; buy Organics');
  331.     writeln(' 6 : BSS Sell Equipment and Organics; buy Fuel Ore');
  332.     writeln(' 7 : SSS Sell all products');
  333.     writeln(' 8 : Sell fighter, shields, holds (Class 0)');
  334.     writeln;
  335.     write('Port description? ');
  336.     readln( pt );
  337.   until (0<=pt) and (pt <= 8);
  338.   GetPortType := pt;
  339. end; {Get Port Type}
  340.